# 基于socket开发一个聊天程序，实现两端互相发送和接收消息
#                                                                                      1
# import socket
# cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# cli.connect(('localhost', 9000))
# mag = input('input>>>').strip()
# cli.send(mag.encode())
# data = cli.recv(1024)
# print(f'{data}')




# 基于tcp协议编写简单FTP程序，实现上传、下载文件功能，并解决粘包问题
#                                                                                      2
# import  socket, os
# cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# cli.connect(('localhost', 9000))
#
# def p(file_size):
#     got_p = 0
#     while got_p <= 100:
#         got_size = yield
#         now_p = int(got_size / file_size * 100)
#         while now_p > got_p:
#             print(f'\r[{now_p}%{">" * now_p}]', end='', flush=True)
#             got_p = now_p
#
# while 1:
#     msg = input('>>>>').strip()
#     if not msg:
#         continue
#     if msg == 'q':
#         break
#     if os.path.isfile(msg):
#         cli.send(msg.encode())
#         msg_head = f'|{os.path.getsize(msg)}'.zfill(32)
#         cli.send(msg_head.encode())
#         f = open(msg, 'rb')
#         for i in f:
#             cli.send(i)
#         f.close()
#         print(f'文件{msg}以传输，大小：{os.path.getsize(msg)}')
#         continue
#
#     cli.send(msg.encode())
#     data_size = cli.recv(1024).decode()
#     file_size = int(data_size.split('|')[1])
#     file_name = msg.split()[1]
#     f = open(f'{file_name}..download', 'wb')
#     p = p(file_size)
#     p.__next__()
#     got_size = 0
#     while got_size < file_size:
#         d = cli.recv(1024)
#         got_size += len(d)
#         p.send(got_size)
#         f.write(d)
#     f.close()
#     print(f'\n文件{file_name}已收到，数据大小：{file_size}')




# 基于tcp socket，开发简单的远程命令执行程序，允许用户执行命令，并返回结果
#                                                                     3
# import socket
# cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# cli.connect(('localhost', 9000))
#
#
# while 1:
#     cmd = input('>>>').strip()
#     if not cmd:
#         continue
#     if cmd == 'q':
#         break
#     cli.send(cmd.encode())
#     cmd_size_head = cli.recv(32).decode()             #防止粘包的固定消息头
#     cmd_size = int(cmd_size_head.split('|')[1])
#     print(cmd_size)
#     cmd_res = ''
#     got_size = 0
#     while got_size < cmd_size:
#         d = cli.recv(1024)
#         got_size += len(d)
#         cmd_res += d.decode()
#     print(cmd_res)




# 基于udp协议编写程序，实现功能
# 1.执行指定的命令，让客户端可以查看服务端的时间        get time
# 2.执行指定的命令，让客户端可以与服务的的时间同步       get time te
#                                                                4
# import socket, os, time
# cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)    #初始化一个类  基于udp开发
#
# while 1:
#     msg = input('>>>').strip()                        #发送指令给电脑
#     if not msg:
#         continue
#     if msg == 'q':
#         break
#     cli.sendto(msg.encode(), ('localhost', 9000))                #发送指令到目标地址
#     data, addr = cli.recvfrom(1024)                              #接收内容和地址
#     tim = data.decode()
#     print(f'来自[{addr}]服务器的时间:{tim}')
#     try:
#         if msg.split()[2]:
#             #loctime = time.localtime(time.mktime(time.strptime('%Y-%m-%d %H:%M:%S',tim)))
#             loctime = time.localtime(float(tim))
#             os.system('data %d-%d-%d ' % (loctime.tm_year, loctime.tm_mon, loctime.tm_mday))
#             os.system('time %d:%d:%d' % (loctime.tm_hour, loctime.tm_min, loctime.tm_sec))
#             print('ok')
#             continue
#     except:
#         pass
#     continue






# 题目：开发一个支持多用户同时在线的FTP程序          TCP（只做了登录 没完成）
#客户端：
# 要求：
# 允许单用户登录                                         （有不同用户）
# 每个用户有自己的家目录，且只能访问自己的家目录
# 对用户进行磁盘配额，每个用户的可用空间不同（选做）
# 允许用户在ftp server上随意切换目录
# 允许用户查看当前目录下的文件
# 允许上传和下载文件，并保证文件的一致性
# 文件传输过程中显示进度条
# 附加：支持文件的断点续传（选做）
# 开发的程序需符合PEP8开发规范，及专业的生产软件设计规范，包括目录、代码命名、功能接口等


# import os,socket
# c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# c.connect(('localhost', 9000))
#
#
# d = {}
# def login():
#     conut = 0
#     while 1:
#         c.send('hi'.encode())
#        # 1.发送登录账号密码给服务器端
#         name = ' ' + input('账号:').strip()
#         if name == ' ':
#             continue
#         if name == ' q':
#             return 'q'
#         paswd = ' ' + input('密码:').strip()
#         msg = 'name' + name + paswd
#         c.send(msg.encode())
# #    2.服务器端回应 账号密码 1或0  回1：登陆成功 显示可输入端口进行下一步操作  回0：登录失败 显示重新登录账号如果登录三次系统自动关闭
#         data = c.recv(1024).decode()
#         if not data:
#             print('系统错误，请重新输入')
#         elif data == '登录成功':
#             return print('登录成功')
#         else:
#             print(data)
#             conut += 1
#             if conut == 3:
#                 exit('系统自动关闭')
#             continue
#
# while 1:
#     if login() == 'q':
#         break


